package it.okkam.comuni;

import it.okkam.costants.CodiciComuni;
import it.okkam.costants.Costanti;
import it.okkam.costants.ExtentMaxLatComune;
import it.okkam.costants.ExtentMaxLonComune;
import it.okkam.costants.ExtentMinLatComune;
import it.okkam.costants.ExtentMinLonComune;
import it.okkam.importdatacreaterdf.LeggiParticelle;
import it.okkam.strutturedati.ConfineComune;
import it.okkam.strutturedati.ParticellaCatastale;
import it.okkam.utility.ConfigReader;
import it.okkam.utility.FillModel;
import it.okkam.utility.FillModelComuni;
import it.okkam.utility.Utility;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.hp.hpl.jena.rdf.model.Model;

public class CreaRDFComuni {
	public static void main(String[] args) {
		Utility ut = new Utility();
		ConfigReader.configReader();
		final long startTime = ut.printInitialTimeSetTime(ConfigReader.comuni);
		
		ConfigReader.configReader();
		List<ConfineComune> lista = leggiComuni();
		creaFileRDFComuni(ConfigReader.comuni, lista, "TURTLE");
		
		ut.printExecutionTimeComuni(startTime, lista);
	}



	public static List<ConfineComune> leggiComuni() {

		Map<String, String> map = CodiciComuni.ComuneMap2Code;
		Map<String, String> mapMaxLat = ExtentMaxLatComune.ComuneMaxLat;
		Map<String, String> mapMaxLon = ExtentMaxLonComune.ComuneMaxLon;
		Map<String, String> mapMinLat = ExtentMinLatComune.ComuneMinLat;
		Map<String, String> mapMinLon = ExtentMinLonComune.ComuneMinLon;

		Set listaComuni = map.keySet();
		Set listaMaxLat = mapMaxLat.keySet();
		Set listaMaxLon = mapMaxLon.keySet();
		Set listaMinLat = mapMinLat.keySet();
		Set listaMinLon = mapMinLon.keySet();


		List<ConfineComune> lista = new ArrayList<ConfineComune>();
		for (Object chiave:listaComuni){		
			ConfineComune comune = new ConfineComune();
			String codiceComune = map.get(chiave);
			comune.setComune(chiave.toString());
			comune.setCodiceComune(codiceComune);
			Double[] exMin= new Double[2];
			for (Object chiave1:listaMinLat){
				String minLat = mapMinLat.get(chiave1);
				if (chiave1.equals(chiave)){
					exMin[0]=Double.valueOf(minLat);
				}}

			for (Object chiave2:listaMinLon){
				String minLon = mapMinLon.get(chiave2);
				if (chiave2.equals(chiave)){
					exMin[1]=Double.valueOf(minLon);}}

			comune.setExtentComuneMin(exMin);

			Double[] exMax= new Double[2];
			for (Object chiave3:listaMaxLat){
				String maxLat = mapMaxLat.get(chiave3);
				if (chiave3.equals(chiave)){
					exMax[0]=Double.valueOf(maxLat);
				}}

			for (Object chiave4:listaMaxLon){
				String maxLon = mapMaxLon.get(chiave4);
				if (chiave4.equals(chiave)){
					exMax[1]=Double.valueOf(maxLon);}}

			comune.setExtentComuneMax(exMax);



			lista.add(comune);	
		}
		
		return lista;}

	public static File creaFileRDFComuni(String nomeFile, List<ConfineComune> listaComuni, String serializzazione) {
		File fileGiovordf = new File(nomeFile);
		FillModelComuni modello = new FillModelComuni();
		Model model = modello.fillModelComuni(listaComuni, Costanti.ONTOLOGIA);
		try{
					model.write(new PrintWriter(fileGiovordf), serializzazione);
				}
				catch(FileNotFoundException e) {			
					e.printStackTrace();
				}
				DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
				Date date = new Date();
				System.out.println("["+dateFormat.format(date)+"] Creazione file " + fileGiovordf.getName() +" terminata!");
				return fileGiovordf;
	}

}
